import React, { Component } from 'react';

/*
//访问器属性不能直接定义，必须使用Object.defineProperty()来定义。
var book = {
    _year: 2018,
    edition: 1
}

Object.defineProperty(book,'year',{
    get: function() {
        return this._year;
    },
    set: function(newValue) {
        if(newValue > 2018) {
            this._year = newValue;
            this.edition += newValue - 2018;
        }
    }
})
book.year = 2019;
console.log(book.edition);

//如何测试一个属性是否有默认的访问器属性

//6.1.2 定义多个属性
//Object.defineProperties() 通过描述符一次定义多个属性。
// 这个方法接受两个对象参数：
// 1.添加和修改其属性的对象
// 2.第二个对象的属性与第一个对象中要添加或修改的属性一一对象。

var book1 = {}
Object.defineProperties(book1,{
    //数据属性
    _year: {
        value: 2018
    },
    edition: {
        value: 1
    },
    //访问器属性
    year: {
        get: function() {
            return this._year;
        },
        set: function(newValue) {
            this._year = newValue;
            this.edition += newValue - 2018;
        }
    }
})

console.log(book1);
//6.1.3 读取属性的特性
//Object.getOwnPropertyDescriptor() 可以取得给定属性的描述符。
//这个方法接受两个参数：1.属性所在的对象。2.要读取其描述符的属性。 返回值是一个对象。

var descriptor = Object.getOwnPropertyDescriptor(book1,'_year');
//为何描述符都是false。
console.log(descriptor.get); //undefined

var descriptor = Object.getOwnPropertyDescriptor(book1,'year');
console.log(typeof descriptor.get); //function
console.log('descriptor.value',descriptor.value); //undefined


var book2 = {
    year: 123
}
var descriptor = Object.getOwnPropertyDescriptor(book2,'year');
console.log(descriptor); //{value: 123, writable: true, enumerable: true, configurable: true}

var book3 = {}
Object.defineProperty(book3,'year',{
    value: 123
});
var descriptor = Object.getOwnPropertyDescriptor(book3,'year');
console.log(descriptor.writable); //false
//下面的方式不能重写year，因为没有写的权限，writable 是false
//Uncaught TypeError: Cannot assign to read only property 'year' of object '#<Object>'
//book3.year = 234;

*/
class Home extends Component {
    constructor(props) {
        super(props);
        this.state = {

        }
    }
    render () {
        return (
            <div>
                面向对象学习
            </div>
        )
    }
}
export default Home;